home *** CD-ROM | disk | FTP | other *** search
/ Gold Medal Software 3 / Gold Medal Software - Volume 3 (Gold Medal) (1994).iso / prog / word.arj / PACMAN.C < prev    next >
C/C++ Source or Header  |  1993-01-28  |  6KB  |  261 lines

  1. #include <dos.h>
  2. #include <alloc.h>
  3. #include <stdio.h>
  4. #include <conio.h>
  5. #include <wgt.h>
  6. #include <scroll.h>
  7.  
  8. void checkpos(void);
  9.  
  10. int spx,spy;
  11. int pacanim,pacdir;
  12. int ox,oy;
  13.  
  14. wgtmap mymap;            // our world map
  15.  
  16. int kbdon[100]={0,0,0,0,0};    // our keyboard on/off array;
  17. int kbdscanlist[100]={72,80,75,77,1};    // our keyboard scan codes;
  18. // You must have the above two if you want the keyboard interrupt 
  19.  
  20. color palette[256];        // our palette of colours
  21.  
  22. block blocks[1001];        // our blocks for the map
  23. block sprites[1001];        // our sprites 
  24.  
  25.  
  26. int bonus,traptime[5];
  27. int killtime[5];
  28. int i;
  29. int pacspeed=8,ghostspeed=8;
  30. int moved[5],movedir[5];
  31. int bluetime;
  32.  
  33. void moveghost(int);
  34.  
  35. void main(void)
  36. {
  37. vga256();
  38.  
  39. wloadsprites(&palette,"pacman.spr",blocks);        // load blocks
  40. wloadsprites(&palette,"pac.spr",sprites);        // load sprites
  41.  
  42. wputblock(0,0,blocks[1],0);
  43. wputblock(0,40,sprites[1],0);
  44. getch();
  45.  
  46. mymap=wloadmap("pacman.wmp");        // load our world map
  47.  
  48.  
  49. winitscroll(10,10);                // make a 12x10 box
  50.                         // for the scrolling
  51.  
  52. wnormscreen();                    // go back to normal screen
  53. wcls(0);                    // clear it
  54. wbutt(1,1,318,198);
  55.  
  56. wshowwindow(0,0,mymap);            // start looking at world
  57.                         // at 0,0
  58. installkbd();                    // start new keyboard interrupt
  59.  
  60. numsprites=5;
  61. wobject[0].on=1; wobject[0].x=192; wobject[0].y=176; wobject[0].num=1;
  62.  
  63. wobject[1].on=1; wobject[1].x=176; wobject[1].y=112; wobject[1].num=21;
  64. wobject[2].on=1; wobject[2].x=176; wobject[2].y=112; wobject[2].num=22;
  65. wobject[3].on=1; wobject[3].x=176; wobject[3].y=112; wobject[3].num=23;
  66. wobject[4].on=1; wobject[4].x=176; wobject[4].y=112; wobject[4].num=24;
  67. for (i=1; i<5; i++) moved[i]=0;
  68. pacanim=1;
  69.  
  70.  
  71. do
  72. {
  73. // The keyboard interrupt sets the value in dir[] to the corresponding
  74. // key from lst[];
  75.  
  76. spx=0;
  77. spy=0;
  78. ox=wobject[0].x;
  79. oy=wobject[0].y;
  80.  
  81. if (kbdon[2]==1)        // Pressing left
  82.   {
  83.   wobject[0].x-=pacspeed;
  84.   checkpos();
  85.   pacdir=2;
  86.   }
  87. else if (kbdon[3]==1)    // Pressing right
  88.   {
  89.   wobject[0].x+=pacspeed;
  90.   checkpos();
  91.   pacdir=0;
  92.   }
  93. else if (kbdon[0]==1)        // Pressing up
  94.   {
  95.   wobject[0].y-=pacspeed;
  96.   checkpos();
  97.   pacdir=1;
  98.   }
  99. else if (kbdon[1]==1)    // Pressing down
  100.   {
  101.   wobject[0].y+=pacspeed;
  102.   checkpos();
  103.   pacdir=3;
  104.   }
  105.  
  106.     if (bluetime>0)
  107.     bluetime--;
  108.  
  109. for (i=1; i<5; i++)
  110.  {
  111.  if (traptime[i]==0)
  112.    {
  113.    moveghost(i);
  114.  if (bluetime>0)
  115.     wobject[i].num=25;
  116.  if ((bluetime==1) | ((bluetime<40) & (bluetime % 2==1)))
  117.     wobject[i].num=20+i;
  118.  if ((soverlap(i,0)==1) & (traptime[i]==0))
  119.    {
  120.    if (bluetime>0)
  121.      {
  122.      wobject[i].num=27+bonus;
  123.      bonus++;
  124.      traptime[i]=100;
  125.      }
  126.    }
  127.   }
  128.   else traptime[i]--;
  129.  if (traptime[i]==1)
  130.     {
  131.     wobject[i].x=192;
  132.     wobject[i].y=144;
  133.     wobject[i].num=20+i;
  134.     bonus=0;
  135. }
  136.  }
  137.  
  138.  
  139. pacanim++;
  140. if (pacanim>5)
  141.   pacanim=1;
  142. wobject[0].num=pacanim+(pacdir*5);
  143.  
  144.  
  145. if (wobject[0].x-worldx<windowmaxx/2-1)
  146.    spx=-pacspeed;
  147. else if (wobject[0].x-worldx>windowmaxx/2+1)
  148.    spx=pacspeed;
  149. if (wobject[0].y-worldy<windowmaxy/2-1)
  150.    spy=-pacspeed;
  151. else if (wobject[0].y-worldy>windowmaxy/2+1)
  152.    spy=pacspeed;
  153.  
  154. nosound();
  155. wscrollwindow(spx,spy,mymap);    // update the scrolling window
  156. wshowobjects();
  157. wcopyscroll(80,15);
  158. } while (kbdon[4] !=1);            // until right button is pressed
  159.  
  160. uninstallkbd();
  161. wendscroll();
  162. wfreesprites(blocks);
  163. wfreesprites(sprites);
  164. wfreemap(mymap);
  165. textmode(C80);
  166. }
  167.  
  168. void checkpos(void)
  169. {
  170. int hit=0;
  171.  
  172.   i=wgetworldblock(wobject[0].x,wobject[0].y,mymap);
  173.   if (tiletype[i]==0)
  174.     hit=1;
  175.   i=wgetworldblock(wobject[0].x+15,wobject[0].y,mymap);
  176.   if (tiletype[i]==0)
  177.     hit=1;
  178.   i=wgetworldblock(wobject[0].x,wobject[0].y+15,mymap);
  179.   if ((tiletype[i]==0) | (tiletype[i]==4))
  180.     hit=1;
  181.   i=wgetworldblock(wobject[0].x+15,wobject[0].y+15,mymap);
  182.   if (tiletype[i]==0)
  183.     hit=1;
  184.   i=wgetworldblock(wobject[0].x+7,wobject[0].y+7,mymap);
  185.   if (tiletype[i]==2)
  186.     {
  187.     sound(500);
  188.     wputworldblock(wobject[0].x+7,wobject[0].y+7,12,mymap);
  189.     }
  190.   if (tiletype[i]==3)
  191.      {
  192.     sound(800);
  193.     wputworldblock(wobject[0].x+7,wobject[0].y+7,12,mymap);
  194.      bluetime+=150;
  195.      }
  196.  
  197.   if (hit==1)
  198.      {
  199.      wobject[0].x=ox;
  200.      wobject[0].y=oy;                   
  201.      }
  202.   }
  203.  
  204.  
  205. void moveghost(int numb)
  206. {
  207. int gox,goy,hit=0,j;
  208.  
  209. gox=wobject[numb].x;
  210. goy=wobject[numb].y;
  211.  
  212. if (moved[numb]==0)
  213.    movedir[numb]=(rand() % 5)+1;
  214.  
  215.    if (movedir[numb]==1)
  216.    wobject[numb].x+=ghostspeed;
  217.    else if (movedir[numb]==2)
  218.    wobject[numb].x-=ghostspeed;
  219.    else if (movedir[numb]==3)
  220.    wobject[numb].y+=ghostspeed;
  221.    else if (movedir[numb]==4)
  222.    wobject[numb].y-=ghostspeed;
  223.  
  224.    moved[numb]+=ghostspeed;
  225.    if (moved[numb]>=16)
  226.      moved[numb]=0;
  227.  
  228.  if (wobject[numb].x<0)
  229.     wobject[numb].x=0;
  230. else if (wobject[numb].x>(mapwidth-1)*16)
  231.     wobject[numb].x=(mapwidth-1)*16;
  232.  if (wobject[numb].y<0)
  233.     wobject[numb].y=0;
  234. else if (wobject[numb].y>(mapheight-1)*16)
  235.     wobject[numb].y=(mapheight-1)*16;
  236.  
  237.   j=wgetworldblock(wobject[numb].x,wobject[numb].y,mymap);
  238.   if (tiletype[j]==0)
  239.     hit=1;
  240.   j=wgetworldblock(wobject[numb].x+15,wobject[numb].y,mymap);
  241.   if (tiletype[j]==0)
  242.     hit=1;
  243.   j=wgetworldblock(wobject[numb].x,wobject[numb].y+15,mymap);
  244.   if (tiletype[j]==0)
  245.     hit=1;
  246.   if ((tiletype[j]==4) & (movedir[numb]==3))
  247.     hit=1;
  248.   j=wgetworldblock(wobject[numb].x+14,wobject[numb].y+15,mymap);
  249.   if (tiletype[j]==0)
  250.     hit=1;
  251.   if (hit==1)
  252.      {
  253.      wobject[numb].x=gox;
  254.      wobject[numb].y=goy;
  255.      moved[numb]=0;
  256.      }
  257. if ((wobject[numb].x==gox) & (wobject[numb].y==goy))
  258.   moveghost(numb);
  259.  
  260. }
  261.